--#include "data\config\equip\EquipSmithConfig.lua" once
--#include "data\config\attr\FuncAttrsConfig.lua" once

--[[装备属性洗练
]]
function EquipSmithFresh( sysarg, equipPtr, lock1, lock2, lock3 )
	if not equipPtr then
		return
	end

	local exitFlag = Item.IsEquipInBodyOrBag( sysarg, equipPtr )
	if exitFlag == 0 then
		return
	end

	local isHero = false
	if exitFlag == 2 then
		isHero = true
	end

	local itemid 		= Item.getItemProperty( sysarg, equipPtr, Item.ipItemID, 0)
	local itemType 		= Item.getItemProperty( sysarg, equipPtr, Item.ipItemType, 0)
	local equipCircle 	= Item.getItemProperty( sysarg, equipPtr, Item.ipItemNeedCircle, 0)
	local equipLevel  	= Item.getItemProperty( sysarg, equipPtr, Item.ipItemActorLevel) or 0
	local smithCount 	= Item.getItemProperty( sysarg, equipPtr, Item.ipItemForgeTimes, 0)			--洗练次数
	--print("EquipSmithFresh, itemid="..itemid..", itemType="..itemType..", equipCircle="..equipCircle..", smithCount="..smithCount)

	if not Item.canEquipSmith(itemType) then			--判断能否洗练
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith003, ttFlyTip)
		return
	end

	local smithCfg = nil
	if equipCircle > 0 then
		smithCfg = GetEquipSmithByEquipCircle( equipCircle )	--根据转数
	else
		smithCfg = GetEquipSmithByEquipLevel( equipLevel )		--根据等级
	end
	if not smithCfg then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith003, ttFlyTip)
		return
	end

	local smithAttrNumMax = GetEquipSmithAttrNumMax( sysarg, smithCfg, equipPtr )				--该装备可洗练的最大属性
	if smithAttrNumMax > 3 then
		return
	end

	local attrCount = Item.getItemSmithAttrsCount( equipPtr )								--已经刷出的极品属性
	--根据条件，调整lock状态
	if smithAttrNumMax > attrCount then			--属性尚未完全刷出，lock1、lock2、lock3无意义
		lock1 = 0
		lock2 = 0
		lock3 = 0
	end
	--print("EquipSmithFresh: lock1="..lock1..", lock2="..lock2..", lock3="..lock3)

	local lockNum = 0
	if lock1 == 2 then
		lockNum = lockNum + 1
	end

	if lock2 == 2 then
		lockNum = lockNum + 1
	end

	if lock3 == 2 then
		lockNum = lockNum + 1
	end

	--print( "EquipSmithFresh, attrNumMax="..smithAttrNumMax..", attrCount="..attrCount..", lockNum="..lockNum )

	if lockNum >= smithAttrNumMax then			--锁定属性满，不能洗练
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith001, ttFlyTip)
		return
	end
	
	local smithConsumes = nil
	smithConsumes = smithCfg.smithConsumes[attrCount+1]
	if not smithConsumes then
		smithConsumes = smithCfg.smithConsumes[#smithCfg.smithConsumes]
	end

	if not smithConsumes then
		return
	end

	local lockConsumes = smithCfg.lockConsumes[lockNum]
	if lockNum > 0 and not lockConsumes then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith001, ttFlyTip)
		return
	end

	local smithId = GetExquipSmithIdBySmithCount( smithCfg, smithCount )
	if smithId <= 0 then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith002, ttFlyTip)
		return
	end
	--print( "EquipSmithFresh, smithId="..smithId..", attrNumMax="..smithAttrNumMax..", attrCount="..attrCount )
	--print( "EquipSmithFresh, smithId="..smithId..", smithCount="..smithCount )

	if not CheckConsumeCond( sysarg, {smithConsumes} ) then
		return 
	end

	if not CheckConsumeCond( sysarg, {lockConsumes} ) then
		return 
	end

	if not DoConsumeCond( sysarg, {smithConsumes}, 1, GameLog.clEquipSmithFreshFee, Lang.ScriptTips.EquipLog010  ) then
		return 
	end

	if not DoConsumeCond( sysarg, {lockConsumes}, 1, GameLog.clEquipSmithFreshFee, Lang.ScriptTips.EquipLog010  ) then
		return 
	end


	Item.setItemProperty( sysarg, equipPtr, Item.ipItemForgeTimes, smithCount+1)			--洗练次数+1

	if attrCount == 0 then
		Item.generateItemOneSmithAttr( sysarg, equipPtr, smithId, 1, lock1, isHero )			--没有属性，则只刷第1条属性
	elseif attrCount == 1 then			--已经刷出有1条属性
		if smithAttrNumMax == 1 then
			Item.generateItemOneSmithAttr( sysarg, equipPtr, smithId, 1, lock1, isHero )
		else
			Item.generateItemOneSmithAttr( sysarg, equipPtr, smithId, 2, lock2, isHero )
		end
	elseif attrCount == 2 then
		if smithAttrNumMax == 2 then
			--print( "EquipSmithFresh, lock1="..lock1)
			--print( "EquipSmithFresh, lock2="..lock2)
			Item.generateItemSmithAttrs( sysarg, equipPtr, smithId, 2, lock1, lock2, 0, isHero )
		elseif smithAttrNumMax == 3 then
			--print( "EquipSmithFresh, lock3="..lock3)
			Item.generateItemOneSmithAttr( sysarg, equipPtr, smithId, 3, lock3, isHero)
		end
	else
		--[[
		local locks = {lock1, lock2, lock3 }
		for propIdx=1, smithAttrNumMax do
			local lock = locks[propIdx] or 0
			--print( "EquipSmithFresh, lock="..lock)
			Item.generateItemOneSmithAttr( sysarg, equipPtr, smithId, propIdx, lock, isHero)
		end
		]]
		--抽取全部属性
		Item.generateItemSmithAttrs( sysarg, equipPtr, smithId, 3, lock1, lock2, lock3, isHero )
	end

	Actor.triggerQuestEvent(sysarg, 48, 2, 1) 			--任务事件，洗练1次
	Actor.triggerAchieveEvent(sysarg, 45, 3, 1)			--成就事件，洗练1次
end

function GetEquipSmithAttrNumMax( sysarg, smithCfg, equipPtr )
	local smithAttrMax  = Item.getItemProperty( sysarg, equipPtr, Item.ipItemSmithAttrMax, 0)
	--print("GetEquipSmithAttrNumMax: smithAttrMax="..smithAttrMax..", smithCfg.attrNum="..smithCfg.attrNum..
	--	", propId="..Item.ipItemSmithAttrMax)
	if smithAttrMax > 0 then
		return smithAttrMax
	end
	return smithCfg.attrNum
end

--[[
洗练转移
]]
function EquipSmithTrans( sysarg, equipPtrSrc, equipPtrDes )
	--[[
	if not equipPtrSrc or not equipPtrDes then
		return
	end

	if equipPtrSrc == equipPtrDes then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith009, ttFlyTip)
		return
	end

	local itemidSrc 		= Item.getItemProperty( sysarg, equipPtrSrc, Item.ipItemID, 0)
	local itemTypeSrc 		= Item.getItemProperty( sysarg, equipPtrSrc, Item.ipItemType, 0)
	local itemCircleSrc 	= Item.getItemProperty( sysarg, equipPtrSrc, Item.ipItemNeedCircle, 0)
	local itemJobSrc 		= Item.getItemProperty( sysarg, equipPtrSrc, Item.ipItemNeedVocation, 0)
	local smithCountSrc 	= Item.getItemProperty( sysarg, equipPtrSrc, Item.ipItemForgeTimes, 0)			--洗练次数
	local smithAttrMaxSrc 	= Item.getItemProperty( itemidSrc, Item.ipItemSmithAttrMax )


	local itemidDes 		= Item.getItemProperty( sysarg, equipPtrDes, Item.ipItemID, 0)
	local itemTypeDes 		= Item.getItemProperty( sysarg, equipPtrDes, Item.ipItemType, 0)
	local itemCircleDes 	= Item.getItemProperty( sysarg, equipPtrDes, Item.ipItemNeedCircle, 0)
	local itemJobDes 		= Item.getItemProperty( sysarg, equipPtrDes, Item.ipItemNeedVocation, 0)
	local smithCountDes 	= Item.getItemProperty( sysarg, equipPtrDes, Item.ipItemForgeTimes, 0)			--洗练次数
	local smithAttrMaxDes 	= Item.getItemProperty( itemidDes, Item.ipItemSmithAttrMax )

	--print("EquipSmithTrans, itemidSrc="..itemidSrc..", itemTypeSrc="..itemTypeSrc..", itemCircleSrc="..itemCircleSrc..", itemJobSrc="..itemJobSrc..
	--	", smithCountSrc="..smithCountSrc)

	if not Item.canEquipSmith( itemTypeSrc ) then			--判断能否洗练
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith004, ttFlyTip)
		return
	end

	if not Item.canEquipSmith( itemTypeDes ) then			--判断能否洗练
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith005, ttFlyTip)
		return
	end

	if itemTypeSrc ~= itemTypeDes then						--相同部位
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.COM0081, ttFlyTip)
		return
	end

	if itemJobSrc ~= itemJobDes then						--相同职业
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.COM0080, ttFlyTip)
		return
	end

	if itemCircleDes < itemCircleSrc then					--不能向低转装备
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith005, ttFlyTip)
		return
	end

	if smithAttrMaxSrc < smithAttrMaxDes then				--神装不能向普通装备转移
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith010, ttFlyTip)
		return
	end


	local smithCfg = GetEquipSmithByEquipCircle( itemCircleSrc )
	if not smithCfg then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith003, ttFlyTip)
		return
	end

	local attrCount = Item.getItemSmithAttrsCount( equipPtrSrc )				--已经刷出的极品属性
	if attrCount <= 0 then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith007, ttFlyTip)
		return
	end

	local transConsumes = smithCfg.transConsumes[attrCount]
	if not transConsumes then
		Actor.sendTipmsg(sysarg, Lang.ScriptTips.EquipSmith008, ttFlyTip)
		return
	end

	if not CheckConsumeCond( sysarg, transConsumes ) then
		return 
	end

	if not DoConsumeCond( sysarg, transConsumes, 1, GameLog.clEquipSmithTransFee, Lang.ScriptTips.EquipLog011  ) then
		return 
	end
	
	Item.transSmithAttrs( equipPtrSrc, equipPtrDes )			--进行洗练属性转移
	Item.setItemProperty( sysarg, equipPtrSrc, Item.ipItemForgeTimes, 0)					--源装备洗练次数清0
	Item.setItemProperty( sysarg, equipPtrDes, Item.ipItemForgeTimes, smithCountSrc)		--设置目标装备洗练次数清0

	Actor.collectOperate( sysarg, 0 ) -- 重新计算角色属性
	SendEquipTransferSmithResult(sysarg, 1)

	local attrCountSrc = Item.getItemSmithAttrsCount( equipPtrSrc )
	local attrCountDes = Item.getItemSmithAttrsCount( equipPtrDes )
	--print( "EquipSmithTrans, attrCountSrc="..attrCountSrc..", attrCountDes="..attrCountDes )
	]]
end


function GetEquipSmithByEquipCircle( equipCircle )
	for i, smithCfg in ipairs( EquipSmithCfg ) do
		if smithCfg.equipCircle[1] <= equipCircle and equipCircle <= smithCfg.equipCircle[2] then
			return smithCfg
		end
	end
	return nil
end

function GetEquipSmithByEquipLevel( equipLevel )
	for i, smithCfg in ipairs( EquipSmithCfg ) do
		if smithCfg.equipLevel[1] <= equipLevel and equipLevel <= smithCfg.equipLevel[2] then
			return smithCfg
		end
	end
	return nil
end

--[[
根据属性洗练次数，确定属性库
]]
function GetExquipSmithIdBySmithCount( smithCfg, smithCount )
	for i, smithLibCfg in ipairs( smithCfg.smithLib ) do
		if smithLibCfg.smithCount[1] <= smithCount and smithCount <= smithLibCfg.smithCount[2] then
			return smithLibCfg.smithId
		end
	end
	return 0
end

--装备洗练转移结果
function  SendEquipTransferSmithResult(sysarg, result)
	local netPack = DataPack.allocPacket(sysarg, enEquipSystemID, sEquipTransSmithResult)
	if netPack then
		DataPack.writeChar(netPack,result)
		DataPack.flush(netPack)
	end
end

